package leetcode;

/**
 * @author caifangyi
 * @date 2022/7/27
 */

/**
 * 592. 分数加减运算
 * 
 * 给定一个表示分数加减运算的字符串expression，你需要返回一个字符串形式的计算结果。
 *
 * 这个结果应该是不可约分的分数，即最简分数。如果最终结果是一个整数，例如2，你需要将它转换成分数形式，其分母为1。所以在上述例子中, 2应该被转换为2/1。
 *
 * 
 *
 * 示例1:
 *
 * 输入:expression= "-1/2+1/2"
 * 输出: "0/1"
 * 示例 2:
 *
 * 输入:expression= "-1/2+1/2+1/3"
 * 输出: "1/3"
 * 示例 3:
 *
 * 输入:expression= "1/3-1/2"
 * 输出: "-1/6"
 * 
 *
 * 提示:
 *
 * 输入和输出字符串只包含'0' 到'9'的数字，以及'/', '+' 和'-'。
 * 输入和输出分数格式均为±分子/分母。如果输入的第一个分数或者输出的分数是正数，则'+'会被省略掉。
 * 输入只包含合法的最简分数，每个分数的分子与分母的范围是[1,10]。如果分母是1，意味着这个分数实际上是一个整数。
 * 输入的分数个数范围是 [1,10]。
 * 最终结果的分子与分母保证是 32 位整数范围内的有效整数。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/fraction-addition-and-subtraction
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Day0592 {

    public static void main(String[] args) {

        Solution solution = new Solution();
        String s = solution.fractionAddition("-1/2+1/2+1/3");
        System.out.println(s);
    }

    static class Solution {
        public String fractionAddition(String expression) {
            //定义初始分子分母
            int demominator = 0, numberator = 1;
            int index = 0, length = expression.length();
            while(index < length){
                int sign = 1;
                if(expression.charAt(index) == '-'||expression.charAt(index) == '+'){
                    sign = expression.charAt(index) == '-'?-1:1;
                    index++;
                }
                int demominator1 = 0;
                while(index < length && Character.isDigit(expression.charAt(index))){
                    demominator1 = demominator1 * 10 + expression.charAt(index) - '0';
                    index++;
                }
                demominator1 = demominator1 * sign;

                index++;
                int numberator1 = 0;
                while(index < length && Character.isDigit(expression.charAt(index))) {
                    numberator1 = numberator1 * 10 + expression.charAt(index) - '0';
                    index++;
                }

                demominator = demominator1 * numberator + demominator * numberator1;
                numberator = numberator1 * numberator;
            }

            //请最大公约数
            long gcd = gcd(Math.abs(demominator), numberator);

            return (demominator/gcd) +"/"+ (numberator/gcd);
        }

        public long gcd(long a, long b) {
            long n = a % b;
            while(n != 0){
                a = b;
                b = n;
                n = a%b;
            }
            return b;
        }

    }
}
